package com.mt.mtyx.common.utils;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 通用的帮助类
 *
 * @author WMT
 * @Date 2023/5/26 14:29
 */
@Slf4j
public class Helper {

    public static final ObjectMapper JACKSON_OBJECT_MAPPER = new ObjectMapper();


    /**
     * 判断对象中属性值是否全为空
     *
     * @param object: 待检查对象
     * @return: 是否为空，true为空对象
     */
    public static boolean checkObjAllFieldsIsNull(Object object) {
        if (null == object) {
            return true;
        }
        try {
            for (Field f : object.getClass().getDeclaredFields()) {
                f.setAccessible(true);
                if (f.get(object) != null && isNotEmpty(f.get(object).toString())) {
                    return false;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }

    /**
     * 获取UUid---使用雪花算法
     *
     * @return 返回id
     */
    public static String GetId() {
        return UUID.randomUUID().toString().trim().replaceAll("-", "");
    }

    /**
     * 字符串 是 空白
     *
     * @param str
     * @return true 字符串 是 空白
     */
    public static boolean isEmpty(String str) {
        if (str == null) {
            return true;
        }
        return str.trim().isEmpty();
    }

    public static boolean isNotEmpty(String str) {
        return !isEmpty(str);
    }

    public static String likeSql(String str) {
        if (str == null || (str = str.trim()).isEmpty()) {
            throw new IllegalArgumentException("参数值是空");
        }
        return "%" + str + "%";
    }

    public static String leftSql(String str) {
        if (str == null || (str = str.trim()).isEmpty()) {
            throw new IllegalArgumentException("参数值是空");
        }
        return "%" + str;
    }

    public static String rightSql(String str) {
        if (str == null || (str = str.trim()).isEmpty()) {
            throw new IllegalArgumentException("参数值是空");
        }
        return str + "%";
    }


    /**
     * @param str
     * @return null 如果是空白
     */
    public static String trim(String str) {
        if (str == null || (str = str.trim()).isEmpty()) {
            return null;
        }
        return str;
    }

    /**
     * 取 正整数
     *
     * @param arg
     * @param defauleVal >=1
     * @return
     */
    public static Integer valuePositive(Integer arg, int defauleVal) {
        if (defauleVal < 1) {
            throw new IllegalArgumentException("必须>=1");
        }

        if (arg == null || arg.intValue() < 1) {
            return Integer.valueOf(defauleVal);
        }
        return arg;
    }

    /**
     * 判断是否符合指定的正则表达式
     *
     * @param context 内容
     * @param reg     正则表达式
     * @return 是否符合正则表达式
     */
    public static boolean isPattern(String context, String reg) {
        Pattern compile = Pattern.compile(reg);
        Matcher matcher = compile.matcher(context);
        return matcher.find();
    }

    /**
     * 判断是否不符合指定的正则表达式
     *
     * @param context 内容
     * @param reg     正则表达式
     * @return 是否符合正则表达式
     */
    public static boolean isNotPattern(String context, String reg) {
        return !isPattern(context, reg);
    }


//    /**
//     * 通用字段赋值
//     *
//     * @param dto token
//     * @param obj 要赋值的对象
//     * @param now 当前时间
//     * @param <T> 泛型对象必须继承ParentEntity
//     */
//    public static <T extends ParentEntity> void setCommonValue(VerifyTokenDto dto, T obj, LocalDateTime now) {
//        obj.setfState(ParentEntity.FSTATE_DRAFT);
//        obj.setfBookCode(dto.getFgrouporgid());
//        obj.setfCreateUserId(dto.getFuserid());
//        obj.setfCreatorTime(now);
//        obj.setfLastModifyUserId(dto.getFuserid());
//        obj.setfLastModifyTime(now);
//    }


    /**
     * 生成策略
     *
     * @param prefix 前缀
     * @param suffix 后缀
     * @return key
     */
    public static String generateKey(String prefix, String suffix) {
        return prefix + "::" + suffix;
    }

    /**
     * 打开文件
     *
     * @param fileName 文件名称
     */
    public static void openDir(String fileName) {
        // 获取系统名称
        String osName = System.getProperty("os.name");
        // 打开下载的文件
        if (osName != null) {
            try {
                if (osName.contains("Mac")) {
                    // 打开文件
                    Runtime.getRuntime().exec("open " + fileName);
                } else if (osName.contains("Windows")) {
                    // 打开文件
                    Runtime.getRuntime().exec("cmd /c start " + fileName);
                } else {
                    log.info("open " + fileName);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
